/*
https://leetcode-cn.com/problems/swap-nodes-in-pairs/
给定一个链表，两两交换其中相邻的节点，并返回交换后的链表。

你不能只是单纯的改变节点内部的值，而是需要实际的进行节点交换。
* */

// 见 README.md
var swapPairs = function(head) {
  const dummyHead = new ListNode(0);
  dummyHead.next = head;
  let temp = dummyHead;
  while (temp.next !== null && temp.next.next !== null) {
    //准备改变的下一组
    const node1 = temp.next;
    const node2 = temp.next.next;
    //temp：上一组的尾
    temp.next = node2; //temp永远指向的是前一个组的尾, temp.next用于连接下一个组交换后的头
    node1.next = node2.next;
    node2.next = node1;
    //移到尾，如果有下一组，在下一轮时会连上 ---> temp.next = node2
    temp = node1; //第一次过后 这个temp指向的就不是dummyHead了 dummyHead.next此时也已经彻底固定
  }
  return dummyHead.next;
};

//这题的亮点在于 dummyHead，虚拟头节点 （保存我们变更后的头结点）

//时间复杂度：O(n)，其中 n 是链表的节点数量。需要对每个节点进行更新指针的操作。
//空间复杂度：O(n)，其中 n 是链表的节点数量。空间复杂度主要取决于递归调用的栈空间。
